]> git.saurik.com Git - apple/security.git/blob - Keychain Circle Notification/KNPersistantState.m
Security-55471.14.tar.gz
[apple/security.git] / Keychain Circle Notification / KNPersistantState.m
1 //
2 // KNPersistantState.m
3 // Security
4 //
5 // Created by J Osborne on 7/28/13.
6 //
7 //
8
9 #import "KNPersistantState.h"
10
11 @implementation KNPersistantState
12
13 -(NSURL*)urlForStorage
14 {
15 return [NSURL URLWithString:@"Preferences/com.apple.security.KCN.plist" relativeToURL:[[NSFileManager defaultManager] URLForDirectory:NSLibraryDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:YES error:nil]];
16 }
17
18 +(instancetype)loadFromStorage
19 {
20 KNPersistantState *state = [[KNPersistantState alloc] init];
21 if (!state) {
22 return state;
23 }
24
25 id plist = @{@"lastWritten": [NSDate distantPast]};
26
27 NSError *error = nil;
28 NSData *stateData = [NSData dataWithContentsOfURL:[state urlForStorage] options:0 error:&error];
29 if (!stateData) {
30 NSLog(@"Can't read state data (p=%@, err=%@)", [state urlForStorage], error);
31 } else {
32 NSPropertyListFormat format;
33 plist = [NSPropertyListSerialization propertyListWithData:stateData options: NSPropertyListMutableContainersAndLeaves format:&format error:&error];
34
35 if (plist == nil) {
36 NSLog(@"Can't deserialize %@, e=%@", stateData, error);
37 }
38 }
39
40 state.lastCircleStatus = plist[@"lastCircleStatus"] ? [plist[@"lastCircleStatus"] intValue] : kSOSCCCircleAbsent;
41 state.lastWritten = plist[@"lastWritten"];
42 state.pendingApplicationReminderInterval = plist[@"pendingApplicationReminderInterval"];
43 state.debugLeftReason = plist[@"debugLeftReason"];
44 state.pendingApplicationReminder = plist[@"pendingApplicationReminder"];
45 state.applcationDate = plist[@"applcationDate"];
46 if (!state.applcationDate) {
47 state.applcationDate = [NSDate distantPast];
48 }
49 if (!state.pendingApplicationReminder) {
50 state.pendingApplicationReminder = [NSDate distantFuture];
51 }
52 if (!state.pendingApplicationReminderInterval || [state.pendingApplicationReminderInterval doubleValue] <= 0) {
53 state.pendingApplicationReminderInterval = [NSNumber numberWithUnsignedInt:60 * 60 * 24 * 2];
54 }
55
56 return state;
57 }
58
59 -(void)writeToStorage
60 {
61 NSMutableDictionary *plist = [@{@"lastCircleStatus": [NSNumber numberWithInt:self.lastCircleStatus],
62 @"lastWritten": [NSDate date],
63 @"applcationDate": self.applcationDate,
64 @"pendingApplicationReminder": self.pendingApplicationReminder,
65 } mutableCopy];
66 if (self.debugLeftReason) {
67 plist[@"debugLeftReason"] = self.debugLeftReason;
68 }
69 if (self.pendingApplicationReminderInterval) {
70 plist[@"pendingApplicationReminderInterval"] = self.pendingApplicationReminderInterval;
71 }
72 NSLog(@"writeToStorage plist=%@", plist);
73
74 NSError *error = nil;
75 NSData *stateData = [NSPropertyListSerialization dataWithPropertyList:[plist copy] format:NSPropertyListXMLFormat_v1_0 options:kCFPropertyListImmutable error:&error];
76 if (!stateData) {
77 NSLog(@"Can't serialize %@: %@", plist, error);
78 return;
79 }
80 if (![stateData writeToURL:[self urlForStorage] options:NSDataWritingAtomic error:&error]) {
81 NSLog(@"Can't write to %@, error=%@", [self urlForStorage], error);
82 }
83 }
84
85
86 @end